/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Data;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

/**
 *
 * @author Rey
 */
public class Crear3d {
    
    int temp;
    int heap;
    int etiq;
    int gotos;
    int ifs;
    int vecs;
    String temporal;
    String etiqueta;
    String escribir;
    ArrayList<String> temporales;
    ArrayList<Sim> tabla;

    public Crear3d() {
        
        this.temp=0;
        this.heap=0;
        this.etiq=0;
        this.gotos =0;
        this.ifs =0;
        this.vecs=0;
        temporal ="t";
        temporales = new ArrayList<String>();
    }

    public ArrayList<Sim> getTabla() {
        return tabla;
    }

    public void setTabla(ArrayList<Sim> tabla) {
        this.tabla = tabla;
    }

    public ArrayList<String> getTemporales() {
        return temporales;
    }

    public void setTemporales(ArrayList<String> temporales) {
        this.temporales = temporales;
    }
    
    
    
    
    public String ValorVar(int pos)
    {
        escribir ="";
        String tempo;
        String pospila = String.valueOf(pos);
        GenTemp();
        tempo = temporal;
        escribir = tempo + " = p + "+pospila+";\n";
        GenTemp();
        escribir =escribir + temporal+" = pila["+tempo+"];\n";
        return escribir;
        
        
    }
    
    public String AsigVar(int pos)
    {
        escribir ="";
        String tempo;
        String pospila = String.valueOf(pos);
        GenTemp();
        tempo = temporal;
        escribir = tempo + " = p + "+pospila+";\n";
        escribir =escribir + "pila["+tempo+"]";
        return escribir;
        
        
    }
    
    
    public Nodo3D ValorCad(String cad,int amb)
    {
        escribir ="";
        Nodo3D nodo;
        char[] letras = cad.toCharArray();
        String pos = getHeap();
        String tempo;
        String temp1;
        
        GenTemp();
        escribir = escribir + temporal + " = h;\n";        
        temp1 = temporal;
        
        for(int i=0; i<=cad.length(); i++)
        {
            
            if(i==0)
            {
                escribir = escribir + "heap("+temporal+") = " + ((int)letras[0])+";\n";
            }
            else if(i==cad.length())
            {
                tempo = temporal;
                GenTemp();
                escribir = escribir + temporal + " = " + tempo + " + 1;\n";
                escribir = escribir + "heap("+temporal+") <- 0;\n"; 
            }
            else
            {
                tempo = temporal;
                GenTemp();
                escribir = escribir + temporal + " = " + tempo + " + 1;\n";
                escribir = escribir + "heap("+temporal+") <- " + ((int)letras[i])+";\n"; 
            }
        }
        
        GenTemp();
        escribir = escribir + temporal + " = p + " + (amb+1) +";\n";
        escribir = escribir + "pila["+temporal+"] = "+ temp1+";\n";
        GenTemp();
        escribir = escribir + temporal + " = p + " + (amb+1) +";\n";
        tempo = temporal;
        GenTemp();
        escribir = escribir + temporal + " = pila[" + tempo +"];\n";
        
        
        
        
        nodo = new Nodo3D(escribir, temporal);
        
        return nodo;
    }

    public Nodo3D Operacion3D(Object e1,String op,Object e2)
    {
              escribir = "";
              Nodo3D n1 = (Nodo3D)e1;
              Nodo3D n2 = (Nodo3D)e2;
              Nodo3D nodop;
              escribir = n1.getCad()+n2.getCad();
              GenTemp();
              escribir = escribir + temporal + " = " + n1.getValor() +" "+ op+" "+ n2.getValor()+";\n";
//              System.out.println(escribir);
              nodop = new Nodo3D(escribir, temporal);
              return nodop;

    }

    public Nodo3D and3D(Object e1, String op, Object e2, int ch)
    {
        escribir = "";
        Nodo3D n1 = (Nodo3D)e1;
        Nodo3D n2 = (Nodo3D)e2;
        Nodo3D nodop;     
        
        if(n2.getValor().equals("1.0")|| n2.getValor().equals("0.0"))
        {
            GenEti();
            n2.setEv(etiqueta);
            GenEti();
            n2.setEf(etiqueta);            
            escribir = "if " + n2.getValor() + " == 1.0  then goto " + n2.getEv() + "\n";
            escribir = escribir + "goto "+ n2.getEf()+";";
            ifs++;
            gotos++;
            n2.setCad(escribir);
//            System.out.println(escribir);
        }
        
        if(ch==2)
        {  
        
        escribir =  n1.getCad()+"\n";
        escribir =  escribir + n1.getEv() +":\n";
        escribir =  escribir + n2.getCad();
//        System.out.println(escribir);
        nodop = new Nodo3D(escribir,"",n2.getEv(),n1.getEf()+","+n2.getEf());
        
        }
        else
        {
            nodop = n2;
//            System.out.println(n2.getCad());
        }


        return nodop;
    }
    
    
    public Nodo3D or3D(Object e1, Object e2)
    {
        escribir ="";
        Nodo3D n1 = (Nodo3D)e1;
        Nodo3D n2 = (Nodo3D)e2;
        Nodo3D nodop;
        escribir = n1.getCad() + "\n";
        escribir = escribir + n1.getEf()+" :\n";
        escribir = escribir + n2.getCad();
//        System.out.println(escribir);
        nodop = new Nodo3D(escribir,"",n1.getEv()+","+n2.getEv(),n2.getEf());
        return nodop;
        
    }


    public Nodo3D Logicos3D(Object e1,String op,Object e2)
    {
              escribir = "";
              String eV="";
              String eF="";
              Nodo3D n1 = (Nodo3D)e1;
              Nodo3D n2 = (Nodo3D)e2;
              Nodo3D nodop;
              escribir = n1.getCad()+n2.getCad();
              GenEti();
              eV = etiqueta;
              GenEti();
              eF = etiqueta;

              escribir = escribir + "if ( "+ n1.getValor()+" " +op+" "+ n2.getValor() +" ) then goto "+eV+"\ngoto "+eF+";\n";
              ifs++;
              gotos++;
              nodop = new Nodo3D(escribir,"");
              nodop.setEv(eV);
              nodop.setEf(eF);
//              System.out.println(escribir);
              return nodop;

    }


    public Nodo3D Inc3D(Sim simbolo, String op, int opc)
    {
        escribir = "";
        String tempo;
        Nodo3D nodo;
        String temp2="";
        int pos = simbolo.getPospila();
        
        if(pos==-1)
        {
            String temp1;
            GenTemp();
            escribir = escribir + temporal + " = " + "p + "+0+";\n"; //pos this
            tempo = temporal; 
            GenTemp();
            escribir = escribir + temporal + " = " + "pila["+tempo+"];\n"; //valor del this
            tempo = temporal; 
            GenTemp();
            escribir = escribir + temporal + " = " + tempo +" + "+ simbolo.getPos()+";\n";
            temp2 = temporal;
            GenTemp();
            escribir = escribir + temporal + " = " + "p + "+0+";\n"; //pos this
            tempo = temporal; 
            GenTemp();
            escribir = escribir + temporal + " = " + "pila["+tempo+"];\n"; //valor del this
            tempo = temporal;            
            GenTemp();
            escribir = escribir + temporal + " = " + tempo +" + "+ simbolo.getPos()+";\n";
            tempo = temporal;
            GenTemp();
            escribir = escribir + temporal + " = " + "heap[" + tempo +"];\n"; //valor id
            
            if(opc==1)
            {
                temp1 = temporal;
                GenTemp();
                escribir = escribir + temporal +" = "+temp1+" "+op+" 1; \n"; 
                tempo = temporal;
                escribir = escribir + "heap["+temp2+"] = "+tempo+";\n";
                
                nodo = new Nodo3D(escribir,temp1);       
            }
            else
            {
                temp1 = temporal;
                GenTemp();
                escribir = escribir + temporal +" = "+temp1+" "+op+" 1; \n"; 
                tempo = temporal;
                escribir = escribir + "heap["+temp2+"] = "+tempo+";\n";                
                nodo = new Nodo3D(escribir,tempo);
            }
            
        }
        else
        {
            int ref = simbolo.getReferencia();
            
            if(ref==1)
            {
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                 tempo = temporal;
                 temp2 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila[" + tempo +"];\n"; //ref
            }
            else
            {    
                 int size = getTamAmbitoActual(simbolo.getAmbito());
                 
                 if(size!=0)
                 {
                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+size+";\n"; //movemos posicion ambito
                    tempo = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " +tempo+ " + "+simbolo.getPospila()+";\n"; //pos
                    temp2 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+size+";\n"; //movemos posicion ambito
                    tempo = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " +tempo+ " + "+simbolo.getPospila()+";\n"; //pos
                    tempo =temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " + "pila[" + tempo +"];\n"; //valor id
                    
                 }
                 else
                 {
                     GenTemp();
                     escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                     temp2 = temporal;
                     GenTemp();
                     escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                     tempo =temporal;
                     GenTemp();
                     escribir = escribir + temporal + " = " + "pila[" + tempo +"];\n"; //valor id
                 }
                 
                
            }
            
            if(opc==1)
            {
                String temp1;                
                temp1 = temporal;
                tempo = temporal;
                GenTemp();
                escribir = escribir + temporal + " = " + tempo +" "+op+" 1;\n"; //suma 1 al valor
                tempo = temporal;                
                escribir = escribir + "pila["+temp2+"] = "+tempo+";\n";
                nodo = new Nodo3D(escribir, temp1);
            }
            else
            {
                
                tempo = temporal;
                GenTemp();
                escribir = escribir + temporal + " = " + tempo +" "+op+" 1;\n"; //suma 1 al valor
                tempo = temporal;                
                escribir = escribir + "pila["+temp2+"] = "+tempo+";\n";
                nodo = new Nodo3D(escribir, tempo);
                
            }
        }   




        return nodo;

    }

    
    public void GenTemp()
    {
        temp++;
        temporal = "t"+String.valueOf(temp);
        if(!temporales.contains(temporal))
        {
            temporales.add(temporal);
        }
        
    }
    
    public void ResetTemp()
    {
        temp =0;
        temporal ="t";
    }

    public String getTemporal() {
        return temporal;
    }
    
    public String getHeap()
    {
        return String.valueOf(heap);
    }

    public void GenEti()
    {
        etiq++;
        etiqueta = "L"+String.valueOf(etiq);
    }

    public int getTemp() {
        return temp;
    }

    public void setTemp(int temp) {
        this.temp = temp;
    }

    

    public int getEtiq() {
        return etiq;
    }

    public void setEtiq(int etiq) {
        this.etiq = etiq;
    }

    public int getGotos() {
        return gotos;
    }

    public void setGotos(int gotos) {
        this.gotos = gotos;
    }

    public int getIfs() {
        return ifs;
    }

    public void setIfs(int ifs) {
        this.ifs = ifs;
    }

    public int getVecs() {
        return vecs;
    }

    public void setVecs(int vecs) {
        this.vecs = vecs;
    }
    
    


    public Nodo3D while3D(String eti,Object cnd, Object crp )
    {
        escribir ="";
        String etq;
        Nodo3D nodo3;

        etq = eti;
        
        
        Nodo3D cond = (Nodo3D) cnd;
        Nodo3D cuerpo = (Nodo3D) crp;
        
        escribir = etq + " :\n";
        escribir = escribir + cond.getCad() + "\n";
        escribir = escribir + cond.getEv() + " :\n";
        escribir = escribir + cuerpo.getCad() + "\n";
        escribir = escribir + "goto " +etq+ ";\n";
        gotos++;
        escribir = escribir + cond.getEf() + " :\n";
        escribir = escribir.replace("Lbreak", cond.getEf());
//        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,"");
        
        return nodo3;
        
        
    }
    
    public Nodo3D dowhile3D(String eti,Object cnd, Object crp)
    {
      
        escribir ="";
        String etq;
        Nodo3D nodo3;

        etq = eti;
        
        
        Nodo3D cond = (Nodo3D) cnd;
        Nodo3D cuerpo = (Nodo3D) crp;//sentencia
        
        escribir = etq + " :\n";
        escribir = escribir + cuerpo.getCad() + "\n";
        escribir = escribir + cond.getCad() + "\n";
        escribir = escribir + cond.getEv() + " :\n";
        escribir = escribir + "goto " +etq+ ";\n";
        gotos++;
        escribir = escribir + cond.getEf() + " :\n";
        
        escribir = escribir.replace("Lbreak", cond.getEf());
        
//        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,"");
        
        return nodo3;
        
        
    }
    
    
    public Nodo3D for3D(String eti,Object asi, Object cnd, Object aum, Object crp)
    {
        escribir ="";
        Nodo3D nodo3;
        Nodo3D  asig = (Nodo3D)asi;
        Nodo3D  cond = (Nodo3D)cnd;
        Nodo3D  ope = (Nodo3D)aum;
        Nodo3D  cuerpo = (Nodo3D)crp;

        String etq = eti;
        escribir = asig.getCad() + "\n";
        escribir = escribir + etq +" :\n";
        
        if(!cond.getCad().equals(""))
        {
        escribir = escribir + cond.getCad() + "\n";  
        escribir = escribir + cond.getEv() + " :\n";  
        }
        escribir = escribir + cuerpo.getCad() + "\n";
        escribir = escribir + ope.getCad() + "\n";
        escribir = escribir + "goto " + etq + ";\n";
        gotos++;
        if(!cond.getCad().equals(""))
        {
          escribir = escribir + cond.getEf() + " :\n";
        }
        
        escribir = escribir.replace("Lbreak", cond.getEf());
//        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,"");
        
        return nodo3;
						
    }
    
    public Nodo3D switch3D(Nodo3D sw, ArrayList<Nodo3D> cases, Object def)
    {
        escribir = "";
        Nodo3D nodo3;
        Nodo3D swit = sw;
        Nodo3D defa = (Nodo3D)def;
        GenEti();
        String etq = etiqueta;
        escribir = swit.getCad()+"\n";
        
        for(Nodo3D cas : cases)
        {
            escribir = escribir + "if  " + swit.getValor() + " == " + cas.getValor() + "  then goto " + cas.getEv() + " \n";
            ifs++;
        }
	
        escribir = escribir + defa.getCad() +"\n";
        escribir = escribir + "goto " + etq + " \n";
        gotos++;
        
        for(Nodo3D cas : cases)
        {          
            escribir = escribir +cas.getEv()+ " :\n";
            escribir = escribir + cas.getCad() + "\n";
            escribir = escribir + "goto " + etq + "; \n";
            gotos++;
        }
        
        escribir = escribir + etq +" :";
//        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,"");
        
        return nodo3;
        
						  
    }
    
    public Nodo3D switch3D2(Nodo3D sw, ArrayList<Nodo3D> cases, Object def)
    {
        escribir = "";
        Nodo3D nodo3;
        Nodo3D swit = sw;
        Nodo3D defa = (Nodo3D)def;
        GenEti();
        String etq = etiqueta;
        escribir = swit.getCad()+"\n";
        
        for(Nodo3D cas : cases)
        {
            escribir = escribir + "if ( " + swit.getValor() + " != " + cas.getValor() + " )  then goto " + cas.getEv() + " \n";
            escribir = escribir + cas.getCad() + "\n";
            if(!cas.getEf().equals(""))
            {
               escribir = escribir + "goto " + etq + ";\n"; 
            }
            escribir = escribir +cas.getEv()+ " :\n";
            
            
        }
	
        escribir = escribir + defa.getCad() +"\n";
        
        if(!defa.getEf().equals(""))
        {
           escribir = escribir + "goto " + etq + ";\n"; 
        }
        escribir = escribir.replace("Lbreak", etq);
        escribir = escribir + etq +" :\n";
        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,"");
        
        return nodo3;
        
						  
    }
    
    public Nodo3D elseif3D(Object lis, Object sei)
    {
        escribir ="";
        Nodo3D  n1 = (Nodo3D)lis;
        Nodo3D  n2 = (Nodo3D)sei;        
        escribir = n1.getCad() + "\n";
	escribir = escribir + "goto "+n1.getEfn()+ "\n";
        gotos++;
	escribir = escribir + n1.getEf()+":\n";
        escribir = escribir + n2.getCad();
        n1.setCad(escribir);
        n1.setEf(n2.getEf());
        	
        
        
        
        return n1;
    }
    
    public Nodo3D if3D(Object cnd, Object crp)
    {
        escribir ="";
        Nodo3D nodo3;
        Nodo3D  cond = (Nodo3D)cnd;
        Nodo3D  cuerpo = (Nodo3D)crp;
        
        escribir = cond.getCad() + "\n";
	escribir = escribir + cond.getEv() + " :\n";
	escribir = escribir + cuerpo.getCad();
        
        nodo3 = new Nodo3D(escribir,"","",cond.getEf());
        	

        
        return nodo3;
    }
    
    
    public Nodo3D sentenciaif3D(Object sif, Object sef)
    {
        escribir ="";
        Nodo3D nodo3;
        Nodo3D  n1 = (Nodo3D)sif;
        Nodo3D  n2 = (Nodo3D)sef;
        
																					
        escribir = n1.getCad();
        if(n2.getEfn().length()==0)
        {
            GenEti();
            escribir = escribir + "goto "+etiqueta+"\n";
            gotos++;
            escribir = escribir + n1.getEf()+":\n";
            escribir = escribir + n2.getCad();
            escribir = escribir +etiqueta+":\n";
        }
        else
        {
            escribir = escribir + "goto "+n2.getEfn()+"\n";
            gotos++;
            escribir = escribir + n1.getEf()+":\n";
            escribir = escribir + n2.getCad();
            
            if(n2.getEf().length()>0)
            {
                escribir = escribir + n2.getEf()+":\n";
            }
            
            escribir = escribir + n2.getEfn()+":\n";
        }
        
//        System.out.println(escribir);
        
        nodo3 = new Nodo3D(escribir,"");
        return nodo3;

    }
    
    
   
    

    public String getEtiqueta() {
        return etiqueta;
    }
	
    
    public void GuardarArchivo(String path, String contenido) {
        File archivo = null;
        BufferedWriter salida = null;
       
        try {
            archivo = new File(path);
            salida = new BufferedWriter(new FileWriter(archivo));
            
            if (contenido != null) {
                salida.write(contenido);
                
                }
            salida.close();
        } catch (IOException ex) {
        }
    }
					



    ///nuevo codigo

    public Nodo3D AsigGlobal(Object var, Object exp)
    {
        escribir ="";
        Nodo3D nodo3;

        Nodo3D asig = (Nodo3D)exp;
        Token  ide = (Token)var;

        escribir = asig.getCad();
        escribir = escribir + ide.getLexema()+" = "+asig.getValor()+";\n";
//        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,"");

        return nodo3;
    }

    public Nodo3D Crear1D(Object exp)
    {
        escribir ="";
        Nodo3D nodo3;

        Nodo3D asig = (Nodo3D)exp;
        GenTemp();
        escribir = asig.getCad();
//        escribir = escribir + temporal + " = " + asig.getValor()+";\n";
        escribir = escribir + temporal + " = " + asig.getValor()+" - 1;\n";
//        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,temporal);

        return nodo3;
    }
    
    public Nodo3D CrearND(Object dims,Object exp,int mul)
    {
        escribir ="";
     
        Nodo3D nodo3;

        Nodo3D dimes = (Nodo3D)dims;
        Nodo3D expr = (Nodo3D)exp;
        String temp1;
        String muls = String.valueOf(mul);
        escribir = escribir + dimes.getCad();
        GenTemp();
        temp1 = temporal;
//        escribir = escribir +temp1+" = "+ dimes.getValor()+" * "+muls+"\n";
//        GenTemp();
        
        if(expr.getCad().equals(""))
        {
            escribir = escribir +temp1+" = "+ expr.getValor()+" - 1;\n";
            GenTemp();
            escribir = escribir +temporal+" = "+ temp1+" * "+muls+";\n";
//            escribir = escribir +temp1+" = "+ expr.getValor()+" * "+muls+";\n";
            GenTemp();
            escribir = escribir + expr.getCad();
            escribir = escribir +temporal+" = "+ temp1+" + "+dimes.getValor()+";\n"; 
        }
        else
        {
            
            
            escribir = escribir + expr.getCad();
//            escribir = escribir +temp1+" ="+ expr.getValor()+" * "+muls+";\n";
            escribir = escribir +temp1+" = "+ expr.getValor()+" - 1;\n";
            GenTemp();
            escribir = escribir +temporal+" = "+ temp1+" * "+muls+";\n";
            GenTemp();
            escribir = escribir +temporal+" = "+ temp1+" + "+dimes.getValor()+";\n"; 
            
        }
        
        
        
//        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,temporal);

        return nodo3;
    }
    
    
    


     public Nodo3D AsigMatrices(Object var, Object exp)
     {
        escribir ="";
        Nodo3D nodo3;

        Nodo3D asig = (Nodo3D)exp;
        Nodo3D ide = (Nodo3D)var;

        escribir = ide.getCad()+asig.getCad();
        escribir = escribir + ide.getValor()+" = "+ asig.getValor()+";\n";
        System.out.println(escribir);
        nodo3 = new Nodo3D(escribir,"");

        return nodo3;
     }
     
     public void GenVec()
     {
         vecs++;
     }
     
     
     //codigo  proyecto
     public Nodo3D valorId(Sim simbolo,int opx)
     {
         escribir ="";
         Nodo3D nodo3 = null;
         int pos;
         int ref;
         String temp1;
         pos = simbolo.getPospila();
         ref = simbolo.getReferencia();
         
         
         if(pos==-1)
         {
                 int posh = simbolo.getPos();
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+0+";\n"; //pos this
                 temp1 = temporal; 
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila["+temp1+"];\n"; //valor del this
                 temp1 = temporal;                 
                 GenTemp();
                 escribir = escribir + temporal + " = " + temp1 +" + "+posh+";\n"; // pos de la variable en el heap
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "heap[" + temp1 +"];\n"; // valor
                 nodo3 = new Nodo3D(escribir, temporal);
         }
         else
         {
             if(opx==0)
             {
                 if(ref==1)
                 {
                     GenTemp();
                     escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                     temp1 = temporal;
                     GenTemp();
                     escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                     temp1 = temporal;
                     GenTemp();
                     escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; // valor

                     nodo3 = new Nodo3D(escribir, temporal);
                 }
                 else
                 {
                     
                     int size = getTamAmbitoActual(simbolo.getAmbito());
                     
                     if(size!=0)
                     {
                         GenTemp();
                         escribir = escribir + temporal + " = " + "p + "+size+";\n"; //pos
                         temp1 = temporal;
                         GenTemp();
                         escribir = escribir + temporal + " = " +temp1+" + "+simbolo.getPospila()+";\n"; //pos
                         temp1 = temporal;
                         GenTemp();
                         escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                         nodo3 = new Nodo3D(escribir, temporal);
                     }
                     else
                     {
                         GenTemp();
                         escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                         temp1 = temporal;
                         GenTemp();
                         escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                         nodo3 = new Nodo3D(escribir, temporal);
                     
                     }

                 }
             
             }
             else
             {
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //
              
                 nodo3 = new Nodo3D(escribir, temporal);
             }
                 
         }
         
         
         
         System.out.println(escribir);
         return nodo3;
     }
     
     public Nodo3D AsigVar(Sim simbolo)
     {
         Nodo3D nodo = null;
         escribir = "";
         int pos = simbolo.getPospila();
         
         
         if(pos==-1)
         {
                 int posh = simbolo.getPos();
                 String temp1;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+0+";\n"; //pos this
                 temp1 = temporal; 
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila["+temp1+"];\n"; //valor del this
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + temp1 +" + "+posh+";\n"; // pos de la variable en el heap                 
                 nodo = new Nodo3D(escribir, temporal);
         }             
         else
         {
             int ref = simbolo.getReferencia();
             String temp1;
             if(ref==Tipo.REF)
             {
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                 nodo = new Nodo3D(escribir, temporal);
             }
             else
             {
                 int size = getTamAmbitoActual(simbolo.getAmbito());

                 if(size!=0)
                 {

                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+size+";\n"; //movemos posicion ambito
                    temp1 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " +temp1+ " + "+simbolo.getPospila()+";\n"; //pos
                    
                    nodo = new Nodo3D(escribir, temporal);
                 }
                 else{
                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                    nodo = new Nodo3D(escribir, temporal);
                    
                 }
             }
                     
             
         }
         System.out.println(escribir);
         return nodo;
     }
     
     public Nodo3D AsigVarOperacion(Sim simbolo)
     {
         Nodo3D nodo = null;
         escribir = "";
         int pos = simbolo.getPospila();
         
         
         if(pos==-1)
         {
                 int posh = simbolo.getPos();
                 String temp1;
                 String temp2;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+0+";\n"; //pos this
                 temp1 = temporal; 
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila["+temp1+"];\n"; //valor del this
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + temp1 +" + "+posh+";\n"; // pos de la variable en el heap   
                 
                 temp2 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "h + 0;\n"; //pos del this
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + temp1 +" + "+posh+";\n"; // pos de la variable en el heap 
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = heap[" + temp1 +"];\n"; 
                           
                 nodo = new Nodo3D(escribir, temp2);
                 nodo.setEfn(temporal);
         }             
         else
         {
             int ref = simbolo.getReferencia();
             String temp1;
             String temp2;
             if(ref==Tipo.REF)
             {
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                 temp2 = temporal;
                 
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                 nodo = new Nodo3D(escribir, temp2);
                 nodo.setEfn(temporal);
             }
             else
             {
                 int size = getTamAmbitoActual(simbolo.getAmbito());

                 if(size!=0)
                 {

                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+size+";\n"; //movemos posicion ambito
                    temp1 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " +temp1+ " + "+simbolo.getPospila()+";\n"; //pos
                    temp2 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+size+";\n"; //movemos posicion ambito
                    temp1 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " +temp1+ " + "+simbolo.getPospila()+";\n"; //pos
                    temp1 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = pila["+temp1+"];\n"; //pos                    
                    nodo = new Nodo3D(escribir, temp2);
                    nodo.setEfn(temporal);
                 }
                 else{
                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                    temp2 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                    temp1 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " + "pila["+temp1+"];\n"; //pos
                    nodo = new Nodo3D(escribir, temp2);
                    nodo.setEfn(temporal);
                    
                 }
             }
                     
             
         }
         System.out.println(escribir);
         return nodo;
     }
     //metodo que genera el codigo para declarar variables globales y locales
     public Nodo3D declararVar(Sim simbolo, Nodo3D exp, Nodo3D var,int opc)
     {
         Nodo3D nodo;
         escribir ="";
         int pos = simbolo.getPospila();
         
         if(pos==-1)
         {
             if(!exp.getValor().equals(""))
             {
                 escribir = escribir + var.getCad();
                 escribir = escribir + exp.getCad();
                 escribir = escribir + "heap["+var.getValor() + "] = " + exp.getValor()+";\n";
                 nodo = new Nodo3D(escribir,"");
             }
             else
             {
                 nodo = new Nodo3D("","");
             }
         }
         else
         {
             if(!exp.getValor().equals(""))
             {
                 escribir = escribir + var.getCad();
                 escribir = escribir + exp.getCad();
                 escribir = escribir + "pila["+var.getValor() + "] = " + exp.getValor()+";\n";
                 nodo = new Nodo3D(escribir,"");
             }
             else
             {
                 nodo = new Nodo3D("","");
             }
         }
         
         System.out.println(escribir);
         return nodo;
     }
     
     public Nodo3D asignacionVarOperaciones(Sim simbolo, Nodo3D exp, Nodo3D var,int opc)
     {
         Nodo3D nodo;
         escribir ="";
         int pos = simbolo.getPospila();
         String operador = getOperador(opc);
         if(pos==-1)
         {
             
             if(!exp.getValor().equals(""))
             {
                 
                 escribir = escribir + var.getCad();
                 escribir = escribir + exp.getCad();
                 GenTemp();
                 escribir = escribir + temporal + " = "+ var.getEfn() + operador + exp.getValor()+";\n";
                 escribir = escribir + "heap["+var.getValor() + "] = " + temporal+";\n";
                 nodo = new Nodo3D(escribir,"");
             }
             else
             {
                 nodo = new Nodo3D("","");
             }
         }
         else
         {
             if(!exp.getValor().equals(""))
             {
                 escribir = escribir + var.getCad();
                 escribir = escribir + exp.getCad();
                 GenTemp();
                 escribir = escribir + temporal + " = "+ var.getEfn() + operador + exp.getValor()+";\n";
                 escribir = escribir + "pila["+var.getValor() + "] = " + temporal+";\n";
                 nodo = new Nodo3D(escribir,"");
             }
             else
             {
                 nodo = new Nodo3D("","");
             }
         }
         
         System.out.println(escribir);
         return nodo;
     }
     
     public String getOperador(int opc)
     {
         String operador = "";
         switch(opc)
         {
             case Instruccion.IMAS:
                 operador = "+";
                 break;
             case Instruccion.IMENOS:
                 operador = "-";
                 break;
             case Instruccion.IPOR:
                 operador = "*";
                 break;
             case Instruccion.IDIV:
                 operador = "/";
                 break;
             case Instruccion.IMOD:
                 operador = "%";
                 break;
                 
         }
         
         return operador;
     }
     //metodo que genera el codigo para declarar matrices globales
     public Nodo3D declararMat(Sim simbolo)
     {
         Nodo3D nodo;
         escribir ="";
         int pos = simbolo.getPospila();
         
         if(pos==-1)
         {
             escribir = escribir + "dec "+simbolo.getNombre()+"."+simbolo.getSize()+";\n";
             nodo = new Nodo3D(escribir,"");
                      
         }
         else
         {
             nodo = new Nodo3D("","");
         }
         
         System.out.println(escribir);
         return nodo;
     }
     
     //metodo que genera la posicion de la matriz local o global
     public Nodo3D posMat(Sim simbolo)
     {
                
         Nodo3D nodo = null;
         escribir = "";
         int pos = simbolo.getPospila();
         
         
         if(pos==-1)
         {
                 int posh = simbolo.getPos();
                 String temp1;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+0+";\n"; //pos this
                 temp1 = temporal; 
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila["+temp1+"];\n"; //valor del this
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + temp1 +" + "+posh+";\n"; // pos de la variable en el heap                 
                 nodo = new Nodo3D(escribir, temporal);
         }             
         else
         {
             int ref = simbolo.getReferencia();
             String temp1;
             if(ref==Tipo.REF)
             {
                 GenTemp();
                 escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = " + "pila[" + temp1 +"];\n"; //ref
                 nodo = new Nodo3D(escribir, temporal);
             }
             else
             {
                 int size = getTamAmbitoActual(simbolo.getAmbito());

                 if(size!=0)
                 {

                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+size+";\n"; //movemos posicion ambito
                    temp1 = temporal;
                    GenTemp();
                    escribir = escribir + temporal + " = " +temp1+ " + "+simbolo.getPospila()+";\n"; //pos
                    
                    nodo = new Nodo3D(escribir, temporal);
                 }
                 else{
                    GenTemp();
                    escribir = escribir + temporal + " = " + "p + "+simbolo.getPospila()+";\n"; //pos
                    nodo = new Nodo3D(escribir, temporal);
                    
                 }
             }
                     
             
         }
         System.out.println(escribir);
         return nodo;
     }
     
     public Nodo3D valorMat(Sim simbolo,Nodo3D mat, Nodo3D dimen)
     {
         Nodo3D nodo;
         escribir = "";
         int pos = simbolo.getPospila();
         
         if(pos==-1)
         {
             nodo = new Nodo3D(dimen.getCad(), mat.getValor() +"[" + dimen.getValor() +"]");
         }
         else
         {
             escribir = escribir + mat.getCad()+"\n";
             escribir = escribir + dimen.getCad()+"\n";
             GenTemp();
             escribir = escribir + temporal + " = "+mat.getValor()+" + " + dimen.getValor()+";\n";
             
             nodo = new Nodo3D(escribir, "pila["+temporal+"]");
         }
         
         return nodo;
     }
     
     public Nodo3D ExpMat(Nodo3D exp)
     {
         Nodo3D nodo;
         escribir = "";
         escribir = escribir + exp.getCad()+"\n";         
         GenTemp();
         escribir = escribir + temporal + " = "+exp.getValor()+";\n";
         
         nodo = new Nodo3D(escribir, temporal);
         
         
         return nodo;
     }
     
     
     public Nodo3D funcion3D(String clase, Sim funcion, Nodo3D cuerpo)
     {
         Nodo3D nodo3;
         escribir ="";
         String simbolo = funcion.getNombre();
         
         if(simbolo.contains("main"))
         {
             escribir ="int " +simbolo+"()\n";
         }
         else
         {
              
              escribir ="void "+clase+"_"+simbolo+funcion.getParams()+"()\n";
         }
         
        
         escribir = escribir +"{\n";
         escribir = escribir +cuerpo.getCad();
         escribir = escribir +"}\n\n";
         
         nodo3 = new Nodo3D(escribir, "");
         
         return nodo3;
                 
     }

     public Nodo3D AsigParam(int dim, Nodo3D exp, int opc, int amb)
     {
         Nodo3D nodo3;
         escribir ="";

         String temp1;

         if(opc==0)
         {
             escribir = escribir + exp.getCad(); // valor del parametro
             GenTemp();
             escribir = escribir + temporal + " =  p + " +amb+";\n"; //movimos ambito
             temp1 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  " +temp1+" + "+ (dim)+";\n"; //pos del param

             escribir = escribir + "pila[" + temporal +"] = "+exp.getValor()+";\n";

         }


         nodo3 = new Nodo3D(escribir,"");

         return nodo3;


     }

     public Nodo3D Llamada3D(int amb,Sim simbolo, Nodo3D par)
     {
         Nodo3D nodo;
         String tval="";
         String tempo;
         escribir = par.getCad();
         escribir = escribir+"p = p + "+amb+";\n";
         String clas = simbolo.getAmbito();
         escribir = escribir +clas+"_"+simbolo.getNombre()+simbolo.getParams()+"();\n";
         if(simbolo.getTipo()!=Tipo.VOID)
         {
             Sim ret = obtenerReturn(simbolo.getName());
             if(ret!=null)
             {
                 GenTemp();
                 escribir = escribir + temporal +" = p + "+(ret.getPospila())+";\n"; 
                 tempo = temporal;
                 GenTemp();
                 escribir = escribir +  temporal + " = pila["+tempo+"];\n";
                 tval = temporal;
             }
         }
         escribir = escribir +"p = p - "+amb+";\n";
         nodo = new Nodo3D(escribir, tval);
         return nodo;

     }
     
     public Nodo3D EscribirTemporales()
     {
         escribir = "";
         Nodo3D nodo;
         
         
         for(String temp1: temporales)
         {
             escribir = escribir + "int "+temp1+" = 0;\n";
         }
         escribir = escribir +"int pila[10000];\n";
         escribir = escribir +"int heap[10000];\n";
         escribir = escribir +"int p = 0;\n";
         escribir = escribir +"int h = 0;\n";
         
         nodo = new Nodo3D(escribir, "");
         
         return nodo;
     }
     
     
     public Nodo3D imprimir3D(Nodo3D exp)
     {
         Nodo3D nodo=null;
         escribir ="";
         String etin,etv, etf;
         int opcion = exp.getOpc();
         switch(opcion)
         {
             case 1: //cadenas
             {
                 GenEti();
                 etin = getEtiqueta();
                 escribir =exp.getCad()+ etin+":\n";
                 GenTemp();
                 escribir = escribir + temporal + " = heap("+exp.getValor()+");\n"; 
                 GenEti();
                 etv = getEtiqueta();
                 GenEti();
                 etf = getEtiqueta();

                 escribir = escribir + "if "+ temporal+" != 0 then goto "+etv+"\ngoto "+etf+"\n";

                 escribir = escribir + etv + ":\n";
                 escribir = escribir + "imprimir(\"%c\" ," + temporal +");\n";
                 escribir = escribir + exp.getValor() +" = "+ exp.getValor() +" +  1;\n"; 
                 escribir = escribir + "goto "+etin+"\n";

                 escribir = escribir + etf + ":\n";
                 escribir = escribir + "imprimir(\"\\n\");\n";
                 break;
             }
             case 2: //variables
             {
                 escribir =exp.getCad()+"\n";
                 escribir = escribir + "imprimir(\"%d\" ," + exp.getValor() +");\n";
                 
                 break;
             }
             case 3: //numeros
             {
                 GenTemp();
                 escribir = escribir + temporal + " = "+ exp.getValor()+";\n";
                 
                 escribir = escribir + "imprimir(\"%d\" ," + temporal +");\n";
                 break;
             }
             case 4://booleanos
             {
                 GenTemp();
                 escribir = escribir + temporal + " = "+ exp.getValor()+";\n";
                 escribir = escribir + "imprimir(\"%d\" ," + temporal +");\n";
                 break;
             } 
             case 5:
             {
                 escribir =exp.getCad()+"\n";
                 escribir = escribir + "imprimir(\"%d\" ," + exp.getValor() +");\n";
                 break;
             }
             case 6:
             {
                 GenTemp();
                 escribir = escribir + temporal + " = "+ exp.getValor()+";\n";
                 escribir = escribir + "imprimir(\"%d\" ," + temporal +");\n";
                 break;
             }
             default:
             {
                 escribir = escribir + "imprimir();\n";
             }
                 
         }
         
         
         nodo = new Nodo3D(escribir, "");
         return nodo;
     }

     public Nodo3D concatenar3D(Nodo3D exp1, Nodo3D exp2)
     {
         Nodo3D nodo= null;
         escribir ="";
         String temp1;
         String tempi;
         String etii, etiv, etif;
         escribir = escribir + exp1.getCad()+"\n" + exp2.getCad()+"\n";

         //posicion del apuntador del heap
         GenTemp();
         escribir = escribir + temporal + " =  h;\n";
         tempi = temp1 = temporal;
         GenTemp();
         escribir = escribir + temporal + " = "+ temp1+";\n";
         
         //genero etiqueta
         GenEti();
         etii = getEtiqueta();
         escribir = escribir + etii+":\n";
         GenTemp();
         escribir = escribir + temporal + " =  heap["+ exp1.getValor()+"];\n";
         GenEti();
         etiv = getEtiqueta();

         GenEti();
         etif = getEtiqueta();

         escribir = escribir + "if "+temporal+" == 0 then goto "+etiv+"\ngoto "+etif+"\n";

         escribir = escribir + etif+":\n";

         escribir = escribir + "heap["+ tempi+ "] = "+ temporal+";\n";


         return nodo;
     }

     
     public String CodigoGlobal(String cadena)
     {
         
         escribir = "proc main() \nbegin\n " + cadena +"end\n";
         return escribir;
     }
     
     public Nodo3D opCasteo(int cas, int de, Sim simbolo)
    {
        Nodo3D nodo=null;
        escribir = "";
        int res =-1;
        int pos = simbolo.getPospila();
        String temp1;
        
        if(pos==-1)
        {
            
        }
        else if(pos==-2)
        {
            
        }
        else
        {
           GenTemp();
           escribir = escribir + temporal +" = p + "+pos+";\n";
        }
        
        switch (cas)
        {
            
            case 1:
            {
                if((de==1)||(de==4))
                {
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = pila["+temp1+");\n";
                    nodo = new Nodo3D(escribir, temporal);
                    return nodo;
                }
                else if(de==3)
                {
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = pila["+temp1+");\n";
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = heap("+temp1+");\n";
                    nodo = new Nodo3D(escribir, temporal);
                    return nodo;
                    
                    
                }
                else
                {
                    nodo = new Nodo3D("", "");
                    return nodo;
                    
                }
                
                
            }
            case 2:
            {
                if(de==1)
                {
                    String temp2 = temporal;
                    GenTemp();
                    
                    escribir = escribir + temporal +" = h;\n";                    
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = "+temp1+" + 1;\n";
                    temp1 = temporal;
                    GenTemp(); 
                    escribir = escribir + temporal +" = pila["+temp2+");\n";
                    escribir = escribir + "heap("+temp1+") = "+temporal+";\n";                    
                    
                    
                    GenTemp();
                    escribir = escribir + temporal +" = p + "+pos+";\n";
                    
                    temp2 = temporal;
                    GenTemp();
                    
                    escribir = escribir + temporal +" = h;\n";                    
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = "+temp1+" + 1;\n";
                    temp1 = temporal;
                    escribir = escribir + "pila["+temp2+") = "+temporal+";\n"; 
                    
                    escribir = escribir +"h = h + 1;\n";
                    nodo = new Nodo3D(escribir, temporal);
                    return nodo;
                }
                else
                {
                    nodo = new Nodo3D("", "");
                    return nodo;
                }
                
                
            }
            case 3:
            {
                if(de==3)
                {
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = pila["+temp1+");\n";
                    nodo = new Nodo3D(escribir, temporal);
                    return nodo;
                }
                else
                {
                    nodo = new Nodo3D("", "");
                    return nodo;
                }
                
               
            }
            case 4:
            {
                if((de==1)||(de==4))
                {
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = pila["+temp1+");\n";
                    nodo = new Nodo3D(escribir, temporal);
                    return nodo;
                }
                else if(de==3)
                {
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = pila["+temp1+"];\n";
                    temp1 = temporal;
                    GenTemp();                    
                    escribir = escribir + temporal +" = heap["+temp1+"];\n";
                    nodo = new Nodo3D(escribir, temporal);
                    return nodo;
                    
                    
                }
                else
                {
                    nodo = new Nodo3D("", "");
                    return nodo;
                    
                }
            }
                
                
            
             
               
                
        }
        
        return nodo;
    }

     public int getTamAmbitoActual(String nuevoambito)
     {
         int size = 0;
         String ambitoactual;

         String[] ambitos = nuevoambito.split("/");

         if(ambitos.length > 2)
         {
             
             ambitoactual= ambitos[0];
             int fin = ambitos.length -1;

             for(int i=1; i < fin;i++ )
             {
                    ambitoactual = ambitoactual +"/"+ ambitos[i];
                    size = size + buscarTamAmbito(ambitoactual);
             }

         }




         return size;
     }

     public int buscarTamAmbito(String ambito)
     {
         int size = 0;
         String rol;
         String nuevoambito;
         for(Sim simbolo : tabla)
         {
             rol = simbolo.getRol();
             if(rol.compareTo(Tipo.AMBITO)==0)
             {
                 nuevoambito = simbolo.getNombre();
                 if(nuevoambito.compareTo(ambito)==0)
                 {
                     size = simbolo.getSize();
                     break;
                 }
             }
             else if(rol.compareTo(Tipo.FUNCION)==0)
             {
                  nuevoambito = simbolo.getName().replace("#", "/");
                  if(nuevoambito.compareTo(ambito)==0)
                  {
                       size = simbolo.getSize();
                       break;
                   }
             }
         }


         return size;
     }
     
     public int sizeAmbitoActual(String nuevoambito)
     {
         int size = 0;
         String ambitoactual;

         String[] ambitos = nuevoambito.split("/");

         
             
             ambitoactual= ambitos[0];
             int fin = ambitos.length;

             for(int i=1; i < fin;i++ )
             {
                    ambitoactual = ambitoactual +"/"+ ambitos[i];
                    size = size + buscarTamAmbito(ambitoactual);
             }
         return size;
     }
     
     public Nodo3D accesoObjetos(Sim objeto, Sim atributo, int acc)
     {
         Nodo3D nodo = null;
         escribir = "";
         String temp1;
         
         if(acc == 1) //acceso
         {
             if(objeto.getPospila()!=-1)
             {
                 GenTemp();
                 escribir = escribir + temporal + " =  p  + " +objeto.getPospila()+";\n"; // pos en pila
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = pila["+temp1+"];\n";//referencia al heap
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = "+temp1+" + "+atributo.getPos()+";\n";//pos en heap
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = heap["+temp1+"];\n";//valor en el heap
                 nodo = new Nodo3D(escribir,temporal);
             }
             else
             {
                 
                 GenTemp();
                 escribir = escribir + temporal + " =  p  + " +objeto.getPos()+";\n"; // pos en heap                 
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = "+temp1+" + "+atributo.getPos()+";\n";//pos en heap
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = heap["+temp1+"];\n";//valor en el heap
                 nodo = new Nodo3D(escribir,temporal);
             
             }
             
         }
         else //posicion
         {
             if(objeto.getPospila()!=-1)
             {
                 GenTemp();
                 escribir = escribir + temporal + " =  p  + " +objeto.getPospila()+";\n"; // pos en pila
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = pila["+temp1+"];\n";//referencia al heap
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = "+temp1+" + "+atributo.getPos()+";\n";//pos en heap                 
                 nodo = new Nodo3D(escribir,temporal);
             }
             else
             {
                 
                 GenTemp();
                 escribir = escribir + temporal + " =  p  + " +objeto.getPos()+";\n"; // pos en heap                 
                 temp1 = temporal;
                 GenTemp();
                 escribir = escribir + temporal + " = "+temp1+" + "+atributo.getPos()+";\n";//pos en heap                 
                 nodo = new Nodo3D(escribir,temporal);
             
             }
             
         }
         
         
         return nodo;
     }
     
     public Nodo3D crearObjeto(Sim objeto, int sizeambito)
     {
         Nodo3D nodo = null;
         String temp1,temp2;
         escribir = "";
         
         if(objeto.getPospila()!= -1)
         {
             GenTemp();
             escribir = escribir + temporal + " =  h + 0;\n";
             temp1 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  p + "+objeto.getPospila()+";\n";
             escribir = escribir + "pila["+temporal+"] = "+ temp1 +";\n";            
             GenTemp();
             escribir = escribir + temporal + " =  p + "+objeto.getPospila()+";\n";
             temp1 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  pila["+temp1+"];\n";
             temp2 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  p + "+sizeambito+";\n";
             temp1 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  "+temp1+" + 0;\n";
             escribir = escribir + "pila["+temporal+"] = "+ temp2 +";\n";
             escribir = escribir +"h = h + "+objeto.getSize()+";\n";
             nodo = new Nodo3D(escribir,"");
         }
         else
         {
             GenTemp();
             escribir = escribir + temporal + " =  h + 0;\n";
             temp1 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  h + "+objeto.getPos()+";\n";
             escribir = escribir + "heap["+temporal+"] = "+ temp1 +";\n";            
             GenTemp();
             escribir = escribir + temporal + " =  h + "+objeto.getPos()+";\n";
             temp1 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  heap["+temp1+"];\n";
             temp2 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  h + "+sizeambito+";\n";
             temp1 = temporal;
             GenTemp();
             escribir = escribir + temporal + " =  "+temp1+" + 0;\n";
             escribir = escribir + "heap["+temporal+"] = "+ temp2 +";\n";
             escribir = escribir +"h = h + "+objeto.getSize()+";\n";
             nodo = new Nodo3D(escribir,"");
         }    
         
         
         return nodo;
     }
     
     public Sim obtenerReturn(String ambito)
     {
         Sim retorno = null;
         String rol;
         String ambitoele;
         String name = ambito.replace("#","/");
         String var = name+"#return";
         for(Sim elemento: tabla)
         {
             rol = elemento.getRol();
             
             if(rol.compareTo(Tipo.VARIABLE)==0)
             {
                 try{
                     ambitoele = elemento.getAmbito();
                 
                 if(ambitoele.compareTo(name)==0)
                 {


                     
                         if(var.compareTo(elemento.getName())==0)
                         {
                             retorno = elemento;
                             break;
                         }
                     
                 }
                 
                 }catch(NullPointerException ex)
                 {
                     System.out.println("error en el elemento: "+elemento.getNombre());
                 }
             
             }
         }
         
         
         
         return retorno;
     }
}
